#include "xorcrypto.h"
#include <stdlib.h>
#include <string.h>


#define DEFAULT_KEY_INFO    "pml@123!!"     // 默认加解密key


#if 0
// 获取异或种子
long getXORSeed(const char* pKey)
{
    if (!pKey) {
        return 0;
    }

    unsigned int uiLen = strlen(pKey);
    if (32 < uiLen) {
        return 0;
    }

    long lSeed = 0;
    for (unsigned int i = 0; i < uiLen; ++i) {
        lSeed = lSeed * 4 + pKey[i];
    }

    return lSeed;
}
#endif

/******************************************************************
 * 功能：使用传入的key进行加解密
 * 输入参数：
 *      pInData：待加解密的数据
 *      uiInLen：待加解密的数据长度
 *      pKey：加解密key数据
 *      uiKeyLen：加解密key数据长度
 * 输出参数：
 *      pOutData：加解密的结果数据
 *      uiOutLen：加解密的结果数据长度
 * 返回值：
 *      int：执行结果，0 - 成功，非0 - 失败
 * ****************************************************************/
int XORCrypto(const char* pInData, unsigned int uiInLen
              , const char* pKey, unsigned int uiKeyLen
              , char* pOutData, unsigned int uiOutLen)
{
    memset(pOutData, 0, uiOutLen);

    if (!pInData || !pOutData || !pKey || (uiInLen > uiOutLen)) {
        return -1;
    }

    for (unsigned int i = 0; i < uiInLen; ++i) {
        pOutData[i] = pInData[i] ^ pKey[i % uiKeyLen];
    }

    return 0;
}

/******************************************************************
 * 功能：使用默认的key进行加解密
 * 输入参数：
 *      pInData：待加解密的数据
 *      uiInLen：待加解密的数据长度
 * 输出参数：
 *      pOutData：加解密的结果数据
 *      uiOutLen：加解密的结果数据长度
 * 返回值：
 *      int：执行结果，0 - 成功，非0 - 失败
 * ****************************************************************/
int XORCryptoByDefaultKey(const char* pInData, unsigned int uiInLen
                          , char* pOutData, unsigned int uiOutLen)
{
    memset(pOutData, 0, uiOutLen);

    if (!pInData || !pOutData || (uiInLen > uiOutLen)) {
        return -1;
    }

    char szKey[16] = {0};
    memcpy(szKey, DEFAULT_KEY_INFO, strlen(DEFAULT_KEY_INFO));
    unsigned int uiKeyLen = (unsigned int)strlen(szKey);

    for (unsigned int i = 0; i < uiInLen; ++i) {
        pOutData[i] = pInData[i] ^ szKey[i % uiKeyLen];
    }

    return 0;
}

